// 防抖:在wait时间内只会执行一次，如果在wait内又再次点击，则会重新计时。
export function debounce(fnc, wait, immediate) {
  let timer = null;

  return function () {
    let _this = this;
    let args = arguments; //改变参数指向

    if (timer) {
      clearInterval(timer);
    }

    if (immediate) {
      let callNow = !timer;

      // 在wait时间内就把timer置空
      timer = setTimeout(() => {
        timer = null;
      }, wait);

      if (callNow) {
        fnc.apply(_this, args);
      }
    } else {
      timer = setTimeout(() => {
        fnc.apply(_this, args); //这是箭头函数啊要改变当前指向问题
      }, wait);
    }
  };
}

// 节流：持续性地触发事件，每隔一段时间，只会执行一次 在新旧时间内
export function throttle(fnc, wait, options) {
  let timer = null;
  let old = 0;
  if (!options) options = {};

  return function () {
    let _this = this;
    let args = arguments;

    let now = new Date().valueOf();

    // 第一次不执行的时候
    if (options.leading == false && !old) {
      old = now;
    }

    if (now - old > wait) {
      if (timer) {
        clearTimeout(timer);
        timer = null;
      }
      fnc.apply(_this, args);
      old = now;
    } else if (!timer && options.trailling !== false) {
      // 最后一次也会执行
      timer = setTimeout(() => {
        old = new Date().valueOf();
        timer = null;
        fnc.apply(_this, args);
      }, wait);
    }
  };
}
